﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace OpGen.Compiler.Parser
{
    /// <summary>
    /// Stellt einen Parser dar
    /// </summary>
    public class OpGenParser : IOpGenParser
    {
        private IOpGenParser _parser;

        /// <summary>
        /// Erstellt eine neue Instanz der OpGenParser-Klasse
        /// </summary>
        /// <param name="sourceFile">Datei die den Quellcode enthält</param>
        public OpGenParser(FileInfo sourceFile)
        {
            if (sourceFile.Exists)
            {
                if(sourceFile.Extension.ToLower() == ".xml")
                    _parser = new OpGenXmlParser(sourceFile);
            }
        }

        /// <summary>
        /// Erstellt eine neue Instanz der OpGenParser-Klasse
        /// </summary>
        /// <param name="sourceFile">Datei die den Quellcode enthält</param>
        /// <param name="baseParser">Der Basisdatei Parser</param>
        /// <remarks>Wird verwendet wenn Include Dateien geladen werden</remarks>
        internal OpGenParser(FileInfo sourceFile, IOpGenParser baseParser)
        {
            if (!sourceFile.Exists)
            {
                if(sourceFile.Extension.ToLower() == ".xml")
                    _parser = new OpGenXmlParser(sourceFile,baseParser);
            }
        }

        /// <summary>
        /// Liefert das Projekt
        /// </summary>
        public ProjectElement Project
        {
            get { return _parser.Project; }
        }

        /// <summary>
        /// Liefert den Basis Parser wenn dies eine Includedatei ist
        /// </summary>
        public IOpGenParser BaseParser
        {
            get { return _parser.BaseParser; }
        }

        /// <summary>
        /// Liefert den Parser
        /// </summary>
        public IOpGenParser Parser { get { return _parser; } }          

        /// <summary>
        /// Liefert die Fehlerliste
        /// </summary>
        public MessageItemCollection ErrorList
        {
            get { return _parser.ErrorList; }
        }

        /// <summary>
        /// Führt den Parservorgang aus
        /// </summary>
        /// <returns></returns>
        public bool Execute()
        {
            return _parser.Execute();
        }
    }
}
